/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.freezer.vixapi;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Ez futtat minden konzol parancsot. Elkérhető tőle
 * az eredmény input stream illetve az error input stram.
 * Ez a legalacsonyabb szintű osztály ami végrehajt utasításokat.
 * @author Zoli
 */
public class CommandExecutor {

    /**
     * Erre van rákötve ez Executor.exec outputja.
     */
    private InputStream out;
    /**
     * Erre van rákötve az Executor.exec error outputja.
     */
    private InputStream errOut;
    /**
     * A stremből kiszedett üzenetet tároljuk itt.
     */
    private String getOutMessage;
    /**
     * Az error streamből kiszedett üzenetet tároljuk itt.
     */
    private String getErrorMessage;
    /**
     * A parancs sikeresen lefutott e, itt megnézhetjük.
     *  0: a sikeres lefutás
     * -1: Rossz lefutás
     */
    private int exitValue;
    /**
     * A executor Process-el tér vissza....
     */
    private Process p;

    private static Logger logger = Logger.getLogger("CommandExecutor");
    private static FileHandler handler;

    CommandExecutor() throws IOException{
        handler = new FileHandler("error.txt");
        logger.addHandler(handler);
    }
    /**
     * Ez futtatja a SystemExecute... cuccot...
     */
    public void runCommand(String command) {
        try {
            p = Runtime.getRuntime().exec(command);
            out = p.getInputStream();
            errOut = p.getErrorStream();
            InputStreamReader isr = new InputStreamReader(p.getInputStream());
            int b;
            while ((b = isr.read()) != -1) {
                // TODO: Logolást beleírni !!!!!
                System.out.print((char)b);
                getOutMessage += (char) b;
            }
            logger.log(Level.ALL, this.getOutMessage);
            isr.close();

            InputStreamReader isr2 = new InputStreamReader(p.getErrorStream());
            int b2;
            while ((b2 = isr2.read()) != -1) {
                // TODO: Logolást beleírni !!!!!
                System.out.print((char)b2);
                getErrorMessage += (char) b;
            }
            logger.log(Level.ALL, this.getErrorMessage);
            isr2.close();
            exitValue = p.exitValue();
        } catch (IOException ex) {
            Logger.getLogger(CommandExecutor.class.getName()).log(Level.INFO, null, ex);
        }
    }

    /**
     * @return the out
     */
    public InputStream getOut() {
        return out;
    }

    /**
     * @param out the out to set
     */
    public void setOut(InputStream out) {
        this.out = out;
    }

    /**
     * @return the errOut
     */
    public InputStream getErrOut() {
        return errOut;
    }

    /**
     * @param errOut the errOut to set
     */
    public void setErrOut(InputStream errOut) {
        this.errOut = errOut;
    }

    /**
     * @return the p
     */
    public Process getP() {
        return p;
    }

    /**
     * @param p the p to set
     */
    public void setP(Process p) {
        this.p = p;
    }

    /**
     * @return the exitValue
     */
    public int getExitValue() {
        return exitValue;
    }

    /**
     * @param exitValue the exitValue to set
     */
    public void setExitValue(int exitValue) {
        this.exitValue = exitValue;
    }

    /**
     * @return the getOutMessage
     */
    public String getGetOutMessage() {
        return getOutMessage;
    }

    /**
     * @param getOutMessage the getOutMessage to set
     */
    public void setGetOutMessage(String getOutMessage) {
        this.getOutMessage = getOutMessage;
    }

    /**
     * @return the getErrorMessage
     */
    public String getGetErrorMessage() {
        return getErrorMessage;
    }

    /**
     * @param getErrorMessage the getErrorMessage to set
     */
    public void setGetErrorMessage(String getErrorMessage) {
        this.getErrorMessage = getErrorMessage;
    }
}
